// 用户单词
import '../dao/dao_user_memory_curve.dart';
import 'model_user_memory_curve.dart';

class ModelUserWord {
  // 编号
  int? id;

  int? userId;

  int? languageId;

  // 单词
  String? word;

  // 单词类型(
  // -1 泛读生词(不提醒复习)
  // 0 生词
  // 1 熟词  )
  int type = 0;

  // 开始复习时间
  int? startReviewTime;

  // 最后复习时间
  int? lastReviewTime;

//  1 开始时间+5M
//  2 开始时间+30M
//  3 开始时间+12H
//  4 开始时间+24H
//  5 开始时间+24*2H
//  6 开始时间+24*4H
//  7 开始时间+24*7H
//  8 开始时间+24*15H
//  9 开始时间+24*30H
//  10 开始时间+24*30*3H
//  11 开始时间+24*30*6H
//  12 开始时间+365D

  // 复习进度
  int reviewProgress = -1;

  // 延期
  int deferred = 0;

  // 统计信息
  // 说 输入 写 错误次数 正确次数
  int sayRightQty = 0;
  int inputRightQty = 0;
  int writeRightQty = 0;
  int sayWrongQty = 0;
  int inputWrongQty = 0;
  int writeWrongQty = 0;

  int listenQty = 0;
  int readQty = 0;

  // 添加时间
  int? gmtCreate;

  // 修改时间
  int? gmtModified;

  String? remark;

  // 判断当前是否要复习
  Future<bool> needReview() async {
    // 忽略的和完成的不需要复习
    if (type != 0) return false;
    // 还没有开始复习
    if (startReviewTime == null || startReviewTime == 0) return true;
    if (lastReviewTime == null || lastReviewTime == 0) return true;

    // 复习曲线
    List<ModelUserMemoryCurve> curves = await DaoUserMemoryCurve.findAll();

    // 计算当前时间与开始复习时间的间隔
    DateTime now = DateTime.now();
    int nowTimeSpan = now.millisecondsSinceEpoch - startReviewTime!;
    // 计算前一次复习时间与开始复习事件的间隔
    int lastTimeSpan = lastReviewTime! - startReviewTime!;

    int curProgress = await calcReviewPosition(nowTimeSpan);
    int lastProgress = await calcReviewPosition(lastTimeSpan);
    if (curProgress == lastProgress) {
      return false;
    }
    if (curProgress - lastProgress > 1) {
      return true;
    }
    if (curProgress - lastProgress == 1) {
      print("map:" + map.toString());
      if (nowTimeSpan - lastTimeSpan > map[curProgress]! - (map[lastProgress] ?? 0)) {
        return true;
      }
    }

    return false;
  }

  static Map<int, int> map = {};

  static Future<int> calcReviewPosition(int timeSpan) async {
    // 复习曲线
    if (map.length < 1) {
      List<ModelUserMemoryCurve> curves = await DaoUserMemoryCurve.findAll();
      for (ModelUserMemoryCurve c in curves) {
        map[c.reviewProgress!] = c.reviewTime!;
      }
    }

    for (int i = 1; i < 13; i++) {
      if (timeSpan < map[i]!) {
        return i - 1;
      }
    }

    return 13;
  }

  // 计算复习进度
  Future<int> calcReviewProgress() async {
    int timeSpan = DateTime.now().millisecondsSinceEpoch - this.startReviewTime!;
    return await calcReviewPosition(timeSpan);
  }
}
